package cc.rengu.redp.flowable.bizmodel.convert;

import cc.rengu.redp.flowable.bizmodel.domain.BizFieldsForCal;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class BizDataConverter implements Converter {

    @Override
    public String produce(JSONObject jsonObj, Map<String, BizFieldsForCal> fieldAlgMap) {

        JSONObject jsonObjRs = new JSONObject();
        //阵列类型的字段先归集在一起，分步处理（阵列类型字段-阵列中的字段列表）
        Map<String, List<BizFieldsForCal>> arrFields = new HashMap<>();

        fieldAlgMap.entrySet().stream().forEach(item -> {
            if (StringUtils.isNotBlank(item.getValue().getFatherFieldName())) {
                List<BizFieldsForCal> fieldsInOneArr = arrFields.get(item.getValue().getFatherFieldName());
                if (fieldsInOneArr == null) {
                    fieldsInOneArr = new ArrayList<>();
                    arrFields.put(item.getValue().getFatherFieldName(), fieldsInOneArr);
                }
                fieldsInOneArr.add(item.getValue());
            } else {
                String valueCal = item.getValue().getFieldAlgorithm().cal(jsonObj);
                jsonObjRs.put(item.getKey(), valueCal);
            }
        });

        //处理阵列类型数据，对源阵列遍历，对阵列中每条数据按模型配置计算，计算后生成新阵列中的数据，最后把新阵列放入业务模型结果数据中
        arrFields.entrySet().stream().forEach(item -> {
            JSONArray jsonArray = jsonObj.getJSONArray(item.getKey());
            JSONArray jsonArrayRs = new JSONArray();
            for (Object obj : jsonArray) {
                JSONObject objInArray = (JSONObject) obj;
                JSONObject objInArrayRs = new JSONObject();
                for (BizFieldsForCal bizFieldsForCal : item.getValue()) {
                    String valueCal = bizFieldsForCal.getFieldAlgorithm().cal(objInArray);
                    objInArrayRs.put(bizFieldsForCal.getFieldName(), valueCal);
                }
                jsonArrayRs.add(objInArrayRs);
            }
            jsonObjRs.put(item.getKey(), jsonArrayRs);
        });

        return jsonObjRs.toJSONString();
    }
}
